package Logica.Modulo.OrdenServicio;

import Persistencia.Definicion.EstadoOrdenServicio;
import cerimice.ValidarDatos;
import Sistema.Configuracion;
import Persistencia.Definicion.Marca;
import Persistencia.Fachada.ListaFachada;
import Persistencia.Definicion.TipoServicio;
import Persistencia.Definicion.OrdenServicio;
import Persistencia.Fachada.OrdenServicioFachada;
import Reportes.PDF.OrdenServicio.ReporteGenerarOrdenServicio;

import Reportes.PDF.OrdenServicio.ReporteGenerarOrdenServicioPorEstado;
import java.util.List;
import java.util.logging.Logger;
import java.util.Date;

import com.vaadin.ui.Table;

/* @author cerimice */
public class OrdenServicioLogica
    {
    private ValidarDatos            valida;
    private ListaFachada            lista;
    private OrdenServicioFachada    objFachada;
    
    private String          titulo;
    private String          error;
    private String          claveOrden;
    
    public OrdenServicioLogica()
        {
        titulo              = "Orden de Servicios";
        valida              = new ValidarDatos();
        lista               = new ListaFachada();
        objFachada          = new OrdenServicioFachada();
        claveOrden          = "";
        }
    
    public Table generarTabla(int campo,String valor,Table tabla) throws Exception
        {
        try
            {
            tabla.removeAllItems();
            List<OrdenServicio> listado = lista.listaOrdenServicio(campo,valor);
            if(listado == null){return tabla;}
            for(OrdenServicio obj:listado)
                {tabla.addItem(new Object[]{obj.getClave(),Configuracion.getFormatoFechaLarga().format(obj.getFechaEntrada()),obj.getEquipoFalla(),obj.getObjCliente().getNombreCompleto(),obj.getObjEstado().getNombre()},obj.getClave());}
            return tabla;
            }
        catch (Exception Ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),Ex.getMessage()); throw Ex;}
        }
    
    public OrdenServicio obtenerObjeto(String clave) throws Exception
        {
        try
            {return objFachada.obtener(clave);}
        catch (Exception Ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),Ex.getMessage()); throw Ex;}
        }
    
    public boolean agregarObjeto(String fechaEntrada,String usuario,String cliente,String servicio,String equipoDescripcion,String equipoMarca,String equipoSerie,String equipoObservaciones,String equipoFalla) throws Exception
        {
        try
            {
            if(validarDatos(fechaEntrada,usuario,cliente,servicio,equipoDescripcion,equipoMarca,equipoSerie,equipoObservaciones,equipoFalla))
                {
                if(objFachada.agregar(fechaEntrada,usuario,cliente,servicio,equipoDescripcion,equipoMarca,equipoSerie,equipoObservaciones,equipoFalla))
                    {
                    claveOrden = objFachada.getClaveOrdenServicio();
                    return true;
                    }
                return false;
                }
            return false;
            }
        catch (Exception Ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),Ex.getMessage()); throw Ex;}
        }
    
    public boolean modificarObjeto(String clave,String fechaEntrada,String usuario,String cliente,String servicio,String equipoDescripcion,String equipoMarca,String equipoSerie,String equipoObservaciones,String equipoFalla) throws Exception
        {
        try
            {
            if(validarDatos(fechaEntrada,usuario,cliente,servicio,equipoDescripcion,equipoMarca,equipoSerie,equipoObservaciones,equipoFalla))
                {
                if(objFachada.modificar(clave,fechaEntrada,usuario,cliente,servicio,equipoDescripcion,equipoMarca,equipoSerie,equipoObservaciones,equipoFalla))
                    {return true;}
                return false;
                }
            return false;
            }
        catch (Exception Ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),Ex.getMessage()); throw Ex;}
        }
    
    public boolean modificarObjeto(String clave,String fechaSalida) throws Exception
        {
        try
            {
            if(validarDatos(fechaSalida))
                {
                if(objFachada.modificar(clave,fechaSalida))
                    {return true;}
                return false;
                }
            return false;
            }
        catch (Exception Ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),Ex.getMessage()); throw Ex;}
        }
    
    public boolean modificarObjeto(String clave,int estado, boolean valido) throws Exception
        {
        try
            {
            OrdenServicio obj = objFachada.obtener(clave);
            if(estado == 5 && valido)
                {error = "No es posible asigar el estado seleccionado, por favor realice un cierre de Orden de Servicio"; return false;}
            
            if(obj.getEstado() > estado)
                {error = "No es posible asignar un estado anterior a esta orden de servicio, por favor verifique su selección"; return false;}
            objFachada.modificar(clave,estado);
            return true;
            }
        catch (Exception Ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),Ex.getMessage()); throw Ex;}
        }
    
    private boolean validarDatos(String fechaEntrada,String usuario,String cliente,String servicio,String equipoDescripcion,String equipoMarca,String equipoSerie,String equipoObservaciones,String fallaObservaciones)
        {
        if(!valida.isFecha(fechaEntrada))           {error = "El campo FECHA DE ENTRADA no es valido"; return false;}
        if(!valida.isCadena(usuario))               {error = "El campo USUARIO no es valido"; return false;}
        if(!valida.isCadena(cliente))               {error = "El campo CLIENTE no es valido"; return false;}
        if(!valida.isCadena(servicio))              {error = "El campo SERVICIO no es valido"; return false;}
        //if(!valida.isCadena(equipoDescripcion))     {error = "El campo DESCRIPCIÓN DEL EQUIPO no es valido"; return false;}
        if(!valida.isCadena(equipoMarca))           {error = "El campo MARCA DEL EQUIPO no es valido"; return false;}
        if(!valida.isCadena(equipoSerie))           {error = "El campo SERIE DEL EQUIPO no es valido"; return false;}
        //if(!valida.isCadena(equipoObservaciones))   {error = "El campo OBSERVACIONES DEL EQUIPO no es valido"; return false;}
        if(!valida.isCadena(fallaObservaciones))    {error = "El campo OBSERVACIONES DE LA FALLA no es valido"; return false;}
        return true;
        }
    
    private boolean validarDatos(String fechaSalida)
        {
        if(!valida.isFecha(fechaSalida))           {error = "El campo FECHA DE SALIDA no es valido"; return false;}
        return true;
        }
    
    public List<EstadoOrdenServicio> getListaEstadoOrdenServicio() throws Exception
        {
        try
            {return lista.listaEstadoOrdenServicio();}
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage()); throw ex;}
        }
    
    public String getError()
        {return error;}
    
    public String getTitulo()
        {return titulo;}
    
    public String getFechaEntrada()
        {return Configuracion.getFormatoFechaCorta().format(new Date());}
    
    public ReporteGenerarOrdenServicio reporteGenerarOrdenServicio() throws Exception
        {
        try
            {return new ReporteGenerarOrdenServicio(objFachada.obtener(claveOrden));}
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage()); throw ex;}
        }
    
    public ReporteGenerarOrdenServicio reporteGenerarOrdenServicio(String ordenServicio) throws Exception
        {
        try
            {return new ReporteGenerarOrdenServicio(objFachada.obtener(ordenServicio));}
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage()); throw ex;}
        }
    
    public ReporteGenerarOrdenServicioPorEstado generarReporteOrdenesPorEstado(String clave,String estado)  throws Exception
        {
        try
            {return new ReporteGenerarOrdenServicioPorEstado(lista.listaOrdenServicio(4,clave),estado);}
        catch (Exception Ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),Ex.getMessage()); throw Ex;}
        }
    
    public List<TipoServicio> getListaTipoServicio() throws Exception
        {
        try
            {return lista.listaTipoServicio();}
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage()); throw ex;}
        }
    
    public List<Marca> getListaMarca() throws Exception
        {
        try
            {return lista.listaMarca();}
        catch (Exception ex)
            {Logger.getLogger(this.getClass().getName()).log(Configuracion.nivelLoggin(),ex.getMessage()); throw ex;}
        }
    }
